import axios from 'axios';
import router from '@/router';
import Vue from 'vue';

const service = axios.create({
  withCredentials: true,
  baseURL: process.env.VUE_APP_BASE_API,
  timeout: 5000,
  // 下面这一行让 Axios 觉得 0~499 以内的状态都算“合法”，
  // 即便它是 401，也不会触发“XHR failed”这类浏览器级红色提示
  validateStatus(status) {
    return status < 500; // 只把 500 及以上当成真正的“网络错误”
  }
});

service.interceptors.request.use(
  config => config,
  error => {
    // 不再打印任何请求级 error
    return Promise.reject(error);
  }
);

service.interceptors.response.use(
  response => {
    // ✅ 所有 2xx 状态码都会进入这里
    if (response.status === 200) {
      return response.data;
    }

    // ✅ 非 200 但 < 500 的状态码，比如 401, 403, 404 等
    const { status } = response;

    switch (status) {
      case 400:
        Vue.prototype.$message.error('请求参数错误');
        break;
      case 401:
        Vue.prototype.$message.error('未授权，请重新登录');
        // 可选：跳转到登录页
        break;
      case 403:
        Vue.prototype.$message.error('没有权限访问该资源');
        break;
      case 404:
        Vue.prototype.$message.error('请求的资源不存在');
        break;
      case 422:
        Vue.prototype.$message.error('请求格式正确，但数据有误');
        break;
      default:
        Vue.prototype.$message.error(`请求失败（状态码：${status}）`);
        break;
    }

    return Promise.reject(new Error('请求失败'));
  },
  error => {
    // ❌ 只有网络错误、服务器错误（>=500）或 Axios 抛出的错误才会进入这里
    if (error.response) {
      const { status } = error.response;

      switch (status) {
        case 500:
          Vue.prototype.$message.error('服务器内部错误，请稍后再试');
          break;
        case 502:
          Vue.prototype.$message.error('网关错误');
          break;
        case 503:
          Vue.prototype.$message.error('服务不可用');
          break;
        case 504:
          Vue.prototype.$message.error('网关超时');
          break;
        default:
          Vue.prototype.$message.error(`服务器异常（状态码：${status}）`);
          break;
      }
    } else if (error.message.includes('timeout')) {
      Vue.prototype.$message.error('请求超时，请检查网络');
    } else {
      Vue.prototype.$message.error('网络错误或服务不可达');
    }

    return Promise.reject(error);
  }
);

const request = {
  get(url, params = {}, config = {}) {
    return service.get(url, { params, ...config });
  },
  post(url, data = {}, config = {}) {
    return service.post(url, data, config);
  }
};

export default request;
